#include"blockQueue.hpp"
#include<pthread.h>
#include<ctime>
#include<unistd.h>
#include"task.hpp"



void* consumer(void* args)
{
    // BlockQueue<int>* bq=static_cast<BlockQueue<int>*>(args);
    BlockQueue<Task>* bq=static_cast<BlockQueue<Task>*>(args);

    while(true)
    {
        sleep(1);
        //int data=0;
        Task t;
        //1.先从blockqueue中获取到数据
        bq->pop(&t);
        t();
        //2.结合业务逻辑处理数据
       std:: cout<<"consumer task:"<<t.formatRes()<<t.formatRes()<<std::endl;
    }
}
void* productor(void* args)
{
    
    //BlockQueue<int>* bq=static_cast<BlockQueue<int>*>(args);
    BlockQueue<Task>* bq=static_cast<BlockQueue<Task>*>(args);
    std::string ops="+-*/%";
     while(true)
    {
        //sleep(1);
        //1.先通过某种方式获取数据
        int x=rand()%10+1;
        int y=rand()%10+1;
        char op=ops[rand()%ops.size()];
        //2.再推送到blockqueue中
        // bq->push(data);
        Task t(x,y,op);
        bq->push(t);
       std:: cout<<"productor task:"<<t.formatArg()<<'?'<<std::endl;

    }
    
}
int main()
{
    srand((uint64_t)time(nullptr)^getpid());
    //单生产单消费->多生产多消费
    //BlockQueue<int> *bq=new BlockQueue<int>();
    BlockQueue<Task>* bq=new BlockQueue<Task>();
    pthread_t c,p;
    pthread_create(&c,nullptr,consumer,bq);
    pthread_create(&p,nullptr,productor,bq);//两线程通过最后一个参数看到通过一个阻塞队列
    
    pthread_join(c,nullptr);
    pthread_join(p,nullptr);
    delete bq;
    return 0;

}
